using System;

namespace Silvery
{
    /// <summary>
    /// 时间标记接口
    /// </summary>
    public interface ITimer
    {
        /// <summary>
        /// 创建时间
        /// </summary>
        DateTime CreateTime { get; }
        /// <summary>
        /// 最后调用的时间
        /// </summary>
        DateTime LastCallTime { get; }
        /// <summary>
        /// 返回最后一次调用和当前访问的时间差
        /// </summary>
        /// <returns></returns>
        TimeSpan LastCallTimeSpan { get; }
        /// <summary>
        /// 调用时间接口，并且返回当前时间
        /// </summary>
        /// <returns></returns>
        DateTime Call();
        /// <summary>
        /// 获取创建成功之后的到现在时间差
        /// </summary>
        /// <param name="isCall">如果为真则会刷新call时间</param>
        /// <returns>返回差值</returns>
        TimeSpan GetCreatedTimeSpan(bool isCall);
    }
    /// <summary>
    /// 一个简单的时间Call类，用来计算很多回Call等操作
    /// </summary>
    public class CallTimer : ITimer
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        public CallTimer()
        {
            LastCallTime = CreateTime = DateTime.Now;
        }
        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateTime { get; private set; }
        /// <summary>
        /// 最后的访问时间
        /// </summary>
        public DateTime LastCallTime { get;private set;}
        /// <summary>
        /// 取得最后一次呼叫时间差
        /// </summary>
        /// <returns></returns>
        public TimeSpan LastCallTimeSpan
        {
            get { return DateTime.Now - LastCallTime; }
        }
        /// <summary>
        /// 刷新最后一次访问的时间，并且返回当前时间
        /// </summary>
        /// <returns></returns>
        public DateTime Call()
        {
            return LastCallTime = DateTime.Now;
        }
        /// <summary>
        /// 获得从创建开始一直到现在的时间差
        /// </summary>
        /// <param name="isCall">如果为真则会刷新call时间</param>
        /// <returns></returns>
        public TimeSpan GetCreatedTimeSpan(bool isCall = false)
        {            
            var createdtimespan = DateTime.Now - CreateTime;
            if (isCall)
                Call();
            return createdtimespan;
        }
    }
}
